package com.szrt.day20170427;


import static org.junit.Assert.*;

import java.lang.reflect.Method;

import org.junit.Test;

/**
 * 使用反射类调用Student类的对象的方法
 * @author scott-13926583118
 * 2017年4月27日
 *
 */
public class MethodTest {
	
	
	/**
	 * 测试getMethods
	 * @throws Exception
	 */
	@Test
	public void methodTest01() throws Exception {
		//1 得到Class
		Class clazz = Class.forName("com.szrt.day20170427.Student");
		
		Student student = (Student) clazz.newInstance();
		
		//student.setStudentAge(22);
		
		//2 getMethods拿到这个类的所有的方法 包括父类的public的方法
		Method[] methods = clazz.getMethods();
		System.out.println(methods.length);
		
		for(Method method:methods){
			
			System.out.println(method.getName());
			
			//如何调用add方法
			
		}
		
		
	}
	
	
	/**
	 * 在循环中 如何调用1个具体的方法
	 * @throws Exception
	 */
	@Test
	public void methodTest02() throws Exception {
		//1 得到Class
		Class clazz = Class.forName("com.szrt.day20170427.Student");
		
		
		//调用的是默认的无参的构造方法
		Student student = (Student) clazz.newInstance();
		
		//student.setStudentAge(22);
		
		//2 getMethods拿到这个类的所有的方法 包括父类的public的方法
		Method[] methods = clazz.getMethods();
		//System.out.println(methods.length);
		
		for(Method method:methods){
			
			String methodName  =method.getName();
			
			
			if("add".equals(methodName)){
				//如何调用add方法
				
				Object object = method.invoke(student, 10,20);
				System.out.println(object);
				
			}
			
		}
		
		
	}
	
	/**
	 * 如何拿到私有的方法
	 * @throws Exception
	 */
	@Test
	public void methodTest03() throws Exception {
		//1 得到Class 照妖镜
		Class clazz = Class.forName("com.szrt.day20170427.Student");
		
		Student student = (Student) clazz.newInstance();
		
		//拿到私有的方法
		Method addMethod = clazz.getDeclaredMethod("add", Integer.class,Integer.class);
		System.out.println(addMethod);
		
		addMethod.setAccessible(true);
		
		Object object = addMethod.invoke(student, 200,300);
		System.out.println(object);
		
		
		// STUDENT_AGE  setStudentAge
		//student.add(200, 300);
		
		//调用setStudentAge?
		//1 拿到方法public  void setStudentAge(int studentAge)
		Method setStudentAgeMethod =clazz.getDeclaredMethod("setStudentAge", int.class);
		//2 在类的对象上调用
		//对象.方法名(参数)  方法名.invoke(对象,参数)
		setStudentAgeMethod.invoke(student, 33);
		
		// getStudentAge
		Method getStudentAgeMethod = clazz.getDeclaredMethod("getStudentAge", null);
		Object jieguo  =getStudentAgeMethod.invoke(student, null);
		System.err.println(jieguo);
		
		
		
		System.out.println(student);
		
	}
	
	
	@Test
	public void methodTest04() throws Exception {
		
		//1 得到Class 照妖镜
		Class clazz = Class.forName("com.szrt.day20170427.Student");
		
		
		//自己的方法 构造方法除外
		System.out.println(clazz.getDeclaredMethods().length);
		
		
		
	}
	

}
